package gui;

import java.util.LinkedList;

public class ChecaSeMetodoPodeSerInvocado 
{
	private DeclaracaoDeMetodo declaracaoDoMetodoASerInvocado;
	
	public ChecaSeMetodoPodeSerInvocado(DeclaracaoDeMetodo declaracaoMetodo)
	{
		this.declaracaoDoMetodoASerInvocado = declaracaoMetodo;
	}
	
	/*Para testar se um metodo pode ser invocado ou nao, eu checo se os parametros
	 * passados na entrada podem ser convertidos para os tipos necessarios para se
	 * invocar o metodo*/
	public boolean metodoPodeSerInvocado(LinkedList<String> valoresDosParametros)
	{
		Class[] tiposParametrosDeEntrada = 
				this.declaracaoDoMetodoASerInvocado.getTiposDosParametrosDeEntrada();
		
		for(int i = 0; i < tiposParametrosDeEntrada.length; i++)
		{
			Class umParametro = tiposParametrosDeEntrada[i];
			String valorParaEsseParametro = valoresDosParametros.get(i);
			try
			{
				Object objetoQueVouUsarParaInvocarOMetodo =
						InstanciaEntradasESaidasDeUmMetodo.converterValorDoParametroEmObjeto(umParametro, valorParaEsseParametro);
			}
			catch(ValorInvalidoParaParametroException e)
			{
				//usuario passou algum valor para um parametro que nao devia
				return false;
			}
		}
		
		/*se nenhuma excecao ValorInvalidoParaParametroException for lancada, eu posso invocar
		 * o metodo com esses valores sem problemas*/
		return true;  
	}
	
	
	/*dado um valor em string para o retorno de um metodo, tentaremos converter esse valor
	 * para o verdadeiro valor do retorno do metodo. Se nao conseguirmos, o retorno
	 * informado como parametro nao eh um retorno valido para o metodo*/
	public boolean retornoDoMetodoPodeTerEsseValor(String retornoDoMetodoEmString)
	{
		Class tipoDoRetorno = this.declaracaoDoMetodoASerInvocado.getTipoDeRetorno();
		
		try 
		{
			InstanciaEntradasESaidasDeUmMetodo.converterValorDoParametroEmObjeto(tipoDoRetorno, retornoDoMetodoEmString);
			return true;
		} 
		catch (ValorInvalidoParaParametroException e) 
		{
			//deu alguma excecao? Entao o retorno informado como parametro nao eh valido
			return false;
		}
	}
}
